package cc.comac.saic.hkhy.jsrj.gj.inttools.parser.impl;


import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

import cc.comac.saic.hkhy.jsrj.gj.inttools.constant.FileType;
import cc.comac.saic.hkhy.jsrj.gj.inttools.parser.DataParser;
import cc.comac.saic.hkhy.jsrj.gj.inttools.parser.IntToolDataReqInfo;
import cc.comac.saic.hkhy.jsrj.gj.inttools.parser.ParseResult;
import cc.comac.saic.hkhy.jsrj.gj.inttools.parser.ParseException;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSONObject;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.ReadContext;

import static cc.comac.saic.hkhy.jsrj.gj.inttools.constant.Constants.INT_TOOL_DATA_ID;
import static cc.comac.saic.hkhy.jsrj.gj.inttools.constant.Constants.INT_TOOL_DATA_REQ_INFO;
import static cc.comac.saic.hkhy.jsrj.gj.inttools.constant.Constants.REQUIREMENT_ITEM_ID;

/**
 * 北航数据
 * 对应
 * hlr-model、archi-model
 *
 * @author shisongyan
 * @since 2025/11/18
 */
public class HlrModelDataParser implements DataParser {
    @Override
    public boolean supports(String data) {
        try {
            JSONObject parse = JSONObject.parse(data);
            String reqModelId = parse.getString("req_model_id");
            ReadContext ctx = JsonPath.parse(data);
            List<Object> read = ctx.read("$..model.entryList[*]");
            return Objects.nonNull(reqModelId)&& CollectionUtil.isNotEmpty(read);
        } catch (Exception e) {
            return false;
        }
    }

    @Override
    public ParseResult parse(String data) throws ParseException {
        ParseResult result = new ParseResult(getParserType());

        try {
            JSONObject parse = JSONObject.parse(data);
            String reqModelId = parse.getString("req_model_id");

            DocumentContext ctx = JsonPath.parse(data);
            List<Map<String, Object>> modelEntrys = ctx.read("$.model[*].entryList[*]");
            List<IntToolDataReqInfo> intToolDataReqInfos = modelEntrys.stream().map(modelEntry -> {
                IntToolDataReqInfo intToolDataReqInfo = new IntToolDataReqInfo();
                intToolDataReqInfo.setId(Optional.ofNullable(reqModelId).orElseThrow());

                DocumentContext modelEntryCtx = JsonPath.parse(modelEntry);
                String reqItemId = modelEntryCtx.read("$.id");
                intToolDataReqInfo.setRequirementItemId(reqItemId);
                return intToolDataReqInfo;
            }).collect(Collectors.toList());

            result.addField(INT_TOOL_DATA_REQ_INFO, intToolDataReqInfos);
        } catch (Exception e) {
            result.setSuccess(false);
            result.setErrorMessage("JSON解析失败: " + e.getMessage());
            throw new ParseException("JSON解析错误", e);
        }

        return result;
    }

    @Override
    public String getParserType() {
        return FileType.HLR_MODEL.getCode();
    }
}
